package TDAArbol;

import TDALista.ListaSE;
import TDALista.Position;
import TDALista.PositionList;



/**
 * Nodo de un arbol general con n hijos
 * @author Jordan
 *
 * @param <T>
 */
public class NodoA<T> implements Position<T>{

	protected NodoA<T> padre;
	protected T rotulo;
	protected PositionList<NodoA<T>> hijos;
	

	/**
	 * constructor sin rotulo, sin padre y hijos vacio
	 */
	public NodoA(){
		padre=null; 
		hijos=new ListaSE<NodoA<T>>(); 
		rotulo=null;
	}
	
	/**
	 * constructor sin padre, con hijos vacio pero con rotulo "R"
	 * @param r rotulo del nodo
	 */
	public NodoA(T r){
		padre=null;
		hijos=new ListaSE<NodoA<T>>(); 
		rotulo=r;
	}
	
	/**
	 * crear un nodo con rotulo "rot", padre "padre" e hijos una nueva lista vacia
	 * @param rot rotulo del nodo
	 * @param padre padre del nodo
	 */
	public NodoA(T rot, NodoA<T> padre){
		this.padre=padre;
		rotulo=rot;
		hijos=new ListaSE<NodoA<T>>();
	}
	
	public NodoA(T r, NodoA<T> p, ListaSE<NodoA<T>> h){
		padre=p;
		rotulo=r;
		hijos=h;	
	}
	
	public T element(){
		return rotulo;
	}
	
	public T getElement() {
		return rotulo;
	}
	
	/**
	 * setea el elemento al nodo
	 * @param e elemento a setear
	 */
	public void setElement(T e)	{
		rotulo = e;
	}
	
	/**
	 * setea el padre del nodo
	 * @param p padre del nodo
	 */
	public void setPadre(NodoA<T> p){
		padre = p;
	}
	
	/**
	 * obtiene el padre del nodo
	 * @return padre del nodo
	 */
	public NodoA<T> getPadre(){
		return padre;
	}

	/**
	 * obtiene los hijos del nodo
	 * @return hijos del nodo
	 */
	public PositionList<NodoA<T>> getHijos(){
		return hijos;
	}
	
	/**setea los hijos del nodo
	 * @param h hijos del nodo
	 */
	public void setHijos(ListaSE<NodoA<T>> h){
		this.hijos = h;
	}
	
	/**
	 * consulta si tiene hijos
	 * @return true:si tiene hijos
	 */
	public boolean hasHijos() {return hijos.isEmpty();}

	

}
